Download e descompactação do corpus disponibilizado pelo Professor: text8

O download do link foi realizado pela biblioteca requests, para a descompactação do arquivo zip foi utilizada a biblioteca zipfile. Por fim o conteudo do arquivo é lido e armazenado em uma variável corpus como uma cadeia de caractéres.

Download de analogias disponibilizadas pelo Professor: analogias

O download do link foi realizado pela biblioteca requests.

Pré-Processamento de Dados

Nesta etapa, todo o texto é transformado numa lista de palavras e colocado em caixa baixa. Além disso, pontuações, números, caractéres especiais e stopwords foram removidas.

Texto convertido para caixa baixa:

Texto transformado em uma lista de palavras utilizando a biblioteca NLTK:

Stopwords, obtidas pelo pacote NLTK, foram retiradas do texto:

Treinamento dos Modelos

Em seguida por intermédio da biblioteca gensim os modelos Continuous Bag of Words e Skip-Gram foram treinados. Como hiperparâmetros dos modelos é interessante destacar os seguintes atributos:

Parâmetros fixos

Parâmetros que foram variados

Função de treinamento dos modelos:

Recebe como parâmetro a dimensão dos embeddings, a janela (ou seja a distância de palavras analisadas), a quantidade de palavras analisadas e o algoritmo (Skip-Gram ou Continuous Bag of Words)

Treinamento do Skip-Gram

Iteramos sobre todas as possíveis combinações de parâmetros que geramos previamente e chamamos a função de treinamento do modelo com o algoritmo Skip-Gram.

Treinamento do Continuous Bag of Words

Iteramos sobre todas as possíveis combinações de parâmetros que geramos previamente e chamamos a função de treinamento do modelo com o algoritmo Continuous Bag of Words.

Validação dos modelos

Para a validação dos modelos o arquivo question-words.txt disponibilizado pelo Professor foi utilizado. Por intermédio da função most_similar da biblioteca gensim, é passado como parâmetro três das quatro palavras de cada analogia do arquivo txt e é verificado se a função do modelo retorna a quarta palavra desta. Essa verificação foi realizada para todas as permutações de hiperparametros propostas para ambos os algoritmos Skip-Gram e Continuous Bag of Words e seus resultados, que foram salvos nos arquivos cbow_accuracy.csv e skipgram_accuracy.csv podem ser vistos abaixo.

Função que recebe como parâmetros um modelo pré-treinado e três palavras e retorna a analogia:

Função que itera sobre todas as analogias em question-words.txt verificando se a analogia retornada pelo modelo é a esperada:

Função que carrega modelo pré-treinado com base em seus hiperparâmetros:

Função que valida os modelos treinados e gera dataframes com a acurácia de cada conjunto de hiperparametros:

Validação Skip-Gram

Obtemos as analogias do arquivo question-words.txt e verificamos se já validamos os modelos treinados buscando pelo arquivo skipgram_accuracy.csv caso esse não exista, validamos o modelo com as funções implementadas acima.

Validação Continuous Bag of Words

Obtemos as analogias do arquivo question-words.txt e verificamos se já validamos os modelos treinados buscando pelo arquivo cbow_accuracy.csv caso esse não exista, validamos o modelo com as funções implementadas acima.

Análise do resultado das analogias

Por meio da biblioteca plotly gráficos mostrando a variação de acurácia em função da mudança de hiperparâmetros para cada uma das combinações de parâmetros são plotados. Além disso, utilizando os parâmetros que retornam melhor acurácia para cada modelo verificamos alguns exemplos de tipos diferentes de analogia.

Skip-Gram

Acurácia x Tamanho do Corpus Utilizado

O eixo x do gráfico representará quantas sentenças do corpus foram utilizadas pelo treinamento, o eixo y representa a acurácia.

Acurácia x Janela (tamanho do contexto utilizado)

O eixo x do gráfico representará o tamanho do contexto analisado no treinamento, o eixo y representa a acurácia.

Acurácia x Dimensão dos Embeddings

O eixo x do gráfico representará a dimensão dos embeddings, o eixo y representa a acurácia.

Parâmetros que resultaram no melhor resultado com base na acurácia

Parâmetros que resultaram no pior resultado com base na acurácia

Continuous Bag of Words

Acurácia x Tamanho do Corpus Utilizado

O eixo x do gráfico representará quantas sentenças do corpus foram utilizadas pelo treinamento, o eixo y representa a acurácia.

Acurácia x Janela (tamanho do contexto utilizado)

O eixo x do gráfico representará o tamanho do contexto analisado no treinamento, o eixo y representa a acurácia.

Acurácia x Dimensão dos Embeddings

O eixo x do gráfico representará a dimensão dos embeddings, o eixo y representa a acurácia.

Parâmetros que resultaram no melhor resultado com base na acurácia

Parâmetros que resultaram no pior resultado com base na acurácia

Exemplos de analogias do modelo com melhor acurácia

Iremos carregar os modelos de ambos os algoritmos com os parâmetros que geram melhor acurácia e testar alguns exemplos de analogias neste utilizando a função most_similar da biblioteca gensim. As analogias testadas serão as seguintes:

  1. Uma analogia vista em sala de aula: man → king, woman → queen
  2. Uma analogia que captura o sentido de profissão e local de trabalho: doctor → hospital, teacher → school
  3. Uma analogia que captura o sentido oposto de uma palavra: negative → positive, cold → hot or warm
  4. Uma analogia que captura radicais iguais para dois verbos. walk → walking, run → running

Continuous Bag of Words

Skip-Gram

Exemplos de analogias do modelo com pior acurácia

Iremos carregar os modelos de ambos os algoritmos com os parâmetros que geram a pior acurácia e testar alguns exemplos de analogias neste utilizando a função most_similar da biblioteca gensim. As analogias testadas serão as seguintes:

  1. Uma analogia vista em sala de aula: man → king, woman → queen
  2. Uma analogia que captura o sentido de profissão e local de trabalho: doctor → hospital, teacher → school
  3. Uma analogia que captura o sentido oposto de uma palavra: negative → positive, cold → hot or warm
  4. Uma analogia que captura radicais iguais para dois verbos. walk → walking, run → running

Continuous Bag of Words

Skip-Gram

Analogias em um plano bidimensional

A função recebe duas listas com conjuntos de embeddings que teoricamente tem o mesmo relacionamento entre si e suas respectivas palavras como labels. Por meio do módulo TSNE a dimensionalidade é reduzida e essas relações são impressas em um gráfico.

A função recebe o modelo, a relação e a lista de países para qual aplicar a relação, encontrando suas respectivas analogias e chamando a função implementada acima plot_word_vector() para mostrar essas relações graficamente.

Exemplo de lista de analogias do melhor modelo gerado com Skip-Gram e Continuous bag of words

  1. A lista countries contém múltiplos países de diferentes continentes, por meio da função get_analogy() com os parametros de um país e o nome de seu povo geramos uma relação e encontramos quem mora em cada um dos países da lista.
  1. A lista countries contém múltiplos países de diferentes continentes, por meio da função get_analogy() com os parametros de um país e o nome de sua capital geramos uma relação e encontramos a capital dos outros países da lista.

Exemplo de lista de analogias do pior modelo gerado com Skip-Gram e Continuous bag of words

  1. A lista countries contém múltiplos países de diferentes continentes, por meio da função get_analogy() com os parametros de um país e o nome de seu povo geramos uma relação e encontramos quem mora em cada um dos países da lista.
  1. A lista countries contém múltiplos países de diferentes continentes, por meio da função get_analogy() com os parametros de um país e o nome de sua capital geramos uma relação e encontramos a capital dos outros países da lista.

Conclusão

Por intermédio dos gráficos que relacionam o valor de acurácia em função da variação de hiperparâmetros, é possivel notar que a acurácia não teve variações altas para múltiplas variações de parâmetro. Entre as mudanças que resultaram em variações notáveis podemos citar o aumento da janela, ou seja, contexto utilizado em treinamento. O aumento desta de 3 para 10 em alguns casos resultou em uma melhora de até 20% em ambos os algoritmos. O aumento do tamanho do corpus utilizado e da dimensão dos embeddings oscilou e não apresentou aumento de acurácia constante.

O pior resultado obtido com cbow foi levemente inferior ao pior resultado obtido com skipgram, a mesma coisa pode ser dita a respeito do melhor caso obtido com cbow, afinal este apresentou acurácia ligeiramente menor ao do skipgram. Vale ressaltar que esta diferença foi menor que um porcento. Diante dos resultados apresentados, pode-se concluir que o algoritmo Skip-Gram foi o que obteve o melhor desempenho final, em termos de acurácia, contudo esse desempenho foi extremamente similar. Estes melhores resultados foram obtidos com janela 10, contudo com a dimensão dos embeddings e tamanho do corpus variando, para o Skip-Gram esta dimensão foi 100 com cerca de 1500 sentenças utilizadas do corpus e para o cbow a dimensão doi 300 com cerca de 300 sentenças utilizadas do corpus.

Referências:

  1. Aulas do curso Aprendizado Profundo para Processamento de Linguagem Natural
  2. Aulas do curso Stanford CS224N: NLP with Deep Learning
  3. Documentação da biblioteca gensim
  4. Documentação da biblioteca nltk
  5. Documentação da biblioteca scikitlearn, especificamente o módulo TSNE